import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;
import info.monitorenter.cpdetector.io.ParsingDetector;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class FileUtil {


    public static void main(String[] args) {
    	FileUtil my=new FileUtil();
    
    }
  
    /**
     * 每次维护好后重新写入文件
     * @param map
     * @param toPath
     * @throws IOException
     */
    public static void writeToTxt(Map<String, Map<String,Integer>> map,String toPath) throws IOException{
 

        /* 写入Txt文件 */  
        File writename = new File(toPath); // 相对路径，如果没有则要建立一个新的output。txt文件  
        writename.createNewFile(); // 创建新文件  
        BufferedWriter out = new BufferedWriter(new FileWriter(writename));  
        //out.write("我会写入文件啦\r\n"); // \r\n即为换行  
     	for(Entry<String, Map<String, Integer>> vo : map.entrySet()){
     			
    	 	 String word=vo.getKey();
    	 	 String writer=word+"|||";
    	 	 Map<String, Integer> numsMap=vo.getValue();
    	 	for(Entry<String, Integer> tempVo : numsMap.entrySet()){
      			writer+=tempVo.getKey()+"|"+tempVo.getValue()+"||";
       	 	}
    	 	out.write(writer.substring(0, writer.length()-2)+"\r\n");
    	 	}
        
        out.flush(); // 把缓存区内容压入文件  
        out.close(); // 最后记得关闭文件  
        System.out.println("writeToTxt Success\r\n");
    	
    }
    
    

    
    /**
     * 读出相应格式的hashmap 注意numMap要根据出现次数排序
     * @param path
     * @return
     * @throws IOException
     */
    public static Map<String, Map<String,Integer>>  readHashTxt(String path) throws IOException{
 	   /* 读入TXT文件 */  
    	Map<String, Map<String,Integer>>  result=new  HashMap<String, Map<String,Integer>>() ;
        File filename = new File(path); // 要读取以上路径的input。txt文件  
      InputStreamReader reader = new InputStreamReader(  
              new FileInputStream(filename)); // 建立一个输入流对象reader  
      BufferedReader br = new BufferedReader(reader); // 建立一个对象，它把文件内容转成计算机能读懂的语言  
      String line ="begin";     
      while ((line = br.readLine() )!= null) {  
        
          String[] split=line.split("\\|\\|\\|");
          String word=split[0];
          String[] nums=split[1].split("\\|\\|");
          Map<String,Integer> numsMap=new HashMap();
          for (int i = 0; i < nums.length; i++) {
			String[] fileAndNum=nums[i].split("\\|");
			numsMap.put(fileAndNum[0], Integer.valueOf(fileAndNum[1]));
		}
          //此处先对numsMap进行排序 = =
          //好像查询时再进行排序比较合适
          result.put(word, numsMap);
      }
	return result; 
    }
    
    
    public static String readToString(String fileName) throws IOException {
		String fileContent = null;
		File file = new File(fileName);
		if (file.isFile()) {
		/* 
		* 探测编码格式;http://cpdetector.sourceforge.net/；

		        * detector是探测器，它把探测任务交给具体的探测实现类的实例完成。 
		        * cpDetector内置了一些常用的探测实现类，这些探测实现类的实例可以通过add方法 加进来，如ParsingDetector、 
		        * JChardetFacade、ASCIIDetector、UnicodeDetector。 
		        * detector按照“谁最先返回非空的探测结果，就以该结果为准”的原则返回探测到的字符集编码。 
		        * 使用需要用到三个第三方JAR包：antlr.jar,chardet.jar,jargs-1.0.jar和cpdetector.jar 
		        * cpDetector是基于统计学原理的，不保证完全正确。 
		        */
		       CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
		       /*
		        * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
		        * 指示是否显示探测过程的详细信息，为false不显示。
		        */
		       detector.add(new ParsingDetector(false));
		       /*
		        * JChardetFacade封装了由Mozilla组织提供的JChardet，它可以完成大多数文件的编码
		        * 测定。所以，一般有了这个探测器就可满足大多数项目的要求，如果你还不放心，可以
		        * 再多加几个探测器，比如下面的ASCIIDetector、UnicodeDetector等。
		        */
		       detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
		       // ASCIIDetector用于ASCII编码测定,
		       //JChardetFacade已可满足大多数项目的要求,ASCIIDetector暂不用
		   //    detector.add(ASCIIDetector.getInstance());
		       // UnicodeDetector用于Unicode家族编码的测定 
		     //JChardetFacade已可满足大多数项目的要求,UnicodeDetector暂不用
		   //    detector.add(UnicodeDetector.getInstance());
		       
		       //编码格式
		       String encoding = null;
		       java.nio.charset.Charset charset = null; 
		       try {
		           charset = detector.detectCodepage(file.toURI().toURL());
		       } catch (Exception ex) {
		           ex.printStackTrace();
		       }
		       if (charset != null) {
		        encoding = charset.name();
		       }else {
		        //若编码格式探测失败,则默认按照"UTF-8"进行读文件
		        encoding = "UTF-8";
		       }
		    fileContent =readFileToString(file,encoding);
		}
		return fileContent;
	}
	/**
	 * 根据文件编码格式将某个文档转换为string内容
	 * @param file
	 * @param encode
	 * @return
	 */
	
	private static String readFileToString(File file,String encode) {  
        String encoding =encode;  
         
        Long filelength = file.length();  
        byte[] filecontent = new byte[filelength.intValue()];  
        try {  
            FileInputStream in = new FileInputStream(file);  
            in.read(filecontent);  
            in.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        try {  
            return new String(filecontent, encoding);  
        } catch (UnsupportedEncodingException e) {  
            System.err.println("The OS does not support " + encoding);  
            e.printStackTrace();  
            return null;  
        }  
    }  

    

}
